package com.pdh.service;

import com.pdh.bean.Courier;
import com.pdh.bean.Message;
import com.pdh.dao.BaseCourierDao;
import com.pdh.dao.imp.CourierDaoMysql;
import com.pdh.exception.DuplicatePhoneException;
import com.pdh.exception.UnHandleException;
import com.pdh.paging.BootStrapTableCourier;
import com.pdh.paging.ResultData;
import com.pdh.util.DateFormatUtil;
import com.pdh.util.LoggerUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @Author: 彭德华
 * @Date 2021-08-29 22:19
 */
public class CourierService {

    /**
     * 这样做的原因是：
     *  降低与数据库的耦合度 改为oracle的话只需要改为：new CourierDaoOracle()即可
     */
    private static BaseCourierDao dao = new CourierDaoMysql();

    /**
     * Courier -> BootStrapTableCourier 实现代码块进行封装，多次使用到
     * @param courier
     * @return tableCourier
     */
    private static BootStrapTableCourier transCourierToTableCourier(Courier courier){
        int id = courier.getId();
        String courierName = courier.getCourierName();
         String courierPhone = courier.getCourierPhone();
         String password = courier.getPassword();
         String courierIdCardNo = courier.getCourierIdCardNo();
         String status = null;
        switch (courier.getStatus()) {
            //0 未登录,1 已登录,2 已挂失,3 已删除,4 已注销
            case 0:
                status = "未登录";
                break;
            case 1:
                status = "已登录";
                break;
            case 2:
                status = "已挂失";
                break;
            case 3:
                status = "已删除";
                break;
            case 4:
                status = "已注销";
                break;
            default:
                break;
        }
         int deliveryCount = courier.getDeliveryCount();
         String loginTime = courier.getLoginTime() == null ? "未登陆" : DateFormatUtil.format(courier.getLoginTime());
        //数据库存储ip采用varbinary(16),我们读取的时候采用INET6_NTOA(LOGIN_IP)
         String loginIp = courier.getLoginIp();
         String createTime = DateFormatUtil.format(courier.getCreateTime());
         String updateTime = courier.getUpdateTime() == null ? "未更新" : DateFormatUtil.format(courier.getUpdateTime());;

         return new BootStrapTableCourier(id,courierName,courierPhone,password,courierIdCardNo,status,deliveryCount,loginTime,loginIp,createTime,updateTime);
    }

    /**
     * 获取控制台所需快递员数据
     * @return 统一为Message格式 status,result,data
     */
    public static Message consoleCourier(){
        Message msg = null;
        try {
            Map<String,Integer> map = dao.consoleCourier();
            if(map.size() == 0){//该数据为空
                msg = new Message(-1,"获取数据为空");
            } else {
                msg = new Message(0,"获取成功",map);
            }
        } catch (UnHandleException e) {
            msg = new Message(-1,"未知异常");
            LoggerUtil.getLogger(CourierService.class).error(e.getMessage());
        }
        return msg;
    }

    /**
     * 用于查询所有的快递员
     *
     * @param paging      是否分页标记 true/false 分页/查询所有
     * @param offset     sql语句起始索引
     * @param limit 页查询的数量
     * @return 快递员的集合
     */
    public static Message findAll(boolean paging, int offset, int limit) {
        Message msg = null;
        List<Courier> queryList = null;
        List<BootStrapTableCourier> tableList = new ArrayList<>();
        ResultData<BootStrapTableCourier> result = null;
        try {
            queryList = dao.findAll(paging,offset,limit);
            if(queryList != null){
                for(Courier courier:queryList){//需要用到BootStrapTableCourier
                    BootStrapTableCourier tableCourier = transCourierToTableCourier(courier);
                    tableList.add(tableCourier);
                }
                Integer total = dao.consoleCourier().get("courierCount");
                result = new ResultData<>(tableList,total);
                msg = new Message(0,"获取成功",result);
            } else {
                msg = new Message(-1,"数据为空");
            }
        } catch (UnHandleException e) {
            msg = new Message(-1,"获取失败,未知异常");
            LoggerUtil.getLogger(CourierService.class).error(e.getMessage());
        }
        return msg;
    }

    /**
     * 根据快递员手机号查询用户信息
     *
     * @param courierPhone 快递员手机号
     * @return 查询的快递员信息，手机号不存在时间放回null
     */
    public static Message findByCourierPhone(String courierPhone) {
        Message msg = null;
        try {
            Courier courier = dao.findByCourierPhone(courierPhone);
            if(courier != null){
                msg = new Message(0,"查询成功",courier);
            } else {
                msg = new Message(-1,"此快递员不存在，请检查号码后重试");
            }
        } catch (UnHandleException e) {
            msg = new Message(-1,"查询失败,未知异常");
            LoggerUtil.getLogger(CourierService.class).error(e.getMessage());
        }
        return msg;
    }

    /**
     * 快递员的插入
     *
     * @param courier 录入的快递员对象
     * @return true/false
     */
    public static Message insert(Courier courier) {
        Message msg = null;
        boolean flag = false;
        try {
            flag = dao.insert(courier);
            if(flag){
                msg = new Message(0,"插入成功");
            } else {
                msg = new Message(-1,"插入失败");
            }
        } catch (DuplicatePhoneException e) {
            //状态码 0表示成功 -1表示未知异常 -2表示快递code重复 -3表示快递单号重复 -4表示电话重复
            msg = new Message(-4,"该快递员已存在，请更换手机号");
        } catch (UnHandleException e) {
            msg = new Message(-1,"插入失败,未知异常");
            LoggerUtil.getLogger(CourierService.class).error(e.getMessage());
        }
        return msg;
    }

    /**
     * 更新快递员的信息
     *
     * @param id         待更新的快递员编号
     * @param newCourier 更新后的快递员对象
     * @return true/false
     */
    public static Message update(int id, Courier newCourier) {
        Message msg = null;
        boolean flag = false;
        try {
            flag = dao.update(id,newCourier);
            if(flag){
                msg = new Message(0,"更新成功");
            } else {
                msg = new Message(-1,"更新失败");
            }
        } catch (DuplicatePhoneException e) {
            //状态码 0表示成功 -1表示未知异常 -2表示快递code重复 -3表示快递单号重复 -4表示电话重复
            msg = new Message(-4,"该快递员已存在，请更换手机号");
        } catch (UnHandleException e) {
            msg = new Message(-1,"更新失败,未知异常");
            LoggerUtil.getLogger(CourierService.class).error(e.getMessage());
        }
        return msg;
    }

    /**
     * 根据快递员id删除快递员信息
     * 为什么不用userPhone进行删除，因为可能一个号码对应多个用户，就删除了多个用户
     *
     * @param id 待删除快递员id
     * @return true/false
     */
    public static Message delete(int id) {
        Message msg = null;
        boolean flag = false;
        try {
            flag = dao.delete(id);
            if(flag){
                msg = new Message(0,"删除成功");
            } else {
                msg = new Message(-1,"删除失败");
            }
        } catch (UnHandleException e) {
            msg = new Message(-1,"删除失败,未知异常");
            LoggerUtil.getLogger(CourierService.class).error(e.getMessage());
        }
        return msg;
    }

    /**
     * 前台快递员登陆的时候使用的service
     * @param courierPhone
     * @return
     */
    public static Message login(String courierPhone){
        Message msg =null;
        try {
            boolean flag = dao.login(courierPhone);
            if(flag){
                msg = new Message(0,"登陆成功");
            } else {
                msg = new Message(-1,"很遗憾,登陆失败");
            }
        } catch (UnHandleException e) {
            msg = new Message(-1,"用户登陆失败,未知异常");
            LoggerUtil.getLogger(CourierService.class).error(e.getMessage());
        }
        return msg;
    }

    public static Message updateLoginInformation(String courierPhone, String ip){
        Message msg =null;
        try {
            boolean flag = dao.updateLoginInformation(courierPhone,ip);
            if(flag){
                msg = new Message(0,"更新成功");
            } else {
                msg = new Message(-1,"更新失败");
            }
        } catch (UnHandleException e) {
            msg = new Message(-1,"更新失败,未知异常");
            LoggerUtil.getLogger(CourierService.class).error(e.getMessage());
        }
        return msg;
    }
}
